package com.example.demo.controller;



import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.common.R;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.SysFile;
import com.example.demo.service.SysFileService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import static com.example.demo.common.R.success;
/**
 * 系统文件表(SysFile)表控制层
 *
 * @author makejava
 * @since 2025-08-26 17:23:53
 */
@RestController
@RequestMapping("sysFile")
public class SysFileController{
    /**
     * 服务对象
     */
    @Resource
    private SysFileService sysFileService;

    /**
     * 分页查询所有数据
     *
     * @param page 分页对象
     * @param sysFile 查询实体
     * @return 所有数据
     */
    @GetMapping
    public R selectAll(Page<SysFile> page, SysFile sysFile) {
        return success(this.sysFileService.page(page, new QueryWrapper<>(sysFile)));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R selectOne(@PathVariable Serializable id) {
        return success(this.sysFileService.getById(id));
    }

    /**
     * 新增数据
     *
     * @param sysFile 实体对象
     * @return 新增结果
     */
    @PostMapping
    public R insert(@RequestBody SysFile sysFile) {
        return success(this.sysFileService.save(sysFile));
    }

    /**
     * 修改数据
     *
     * @param sysFile 实体对象
     * @return 修改结果
     */
    @PutMapping
    public R update(@RequestBody SysFile sysFile) {
        return success(this.sysFileService.updateById(sysFile));
    }

    /**
     * 删除数据
     *
     * @param idList 主键结合
     * @return 删除结果
     */
    @DeleteMapping
    public R delete(@RequestParam("idList") List<Long> idList) {
        return success(this.sysFileService.removeByIds(idList));
    }

    /**
     * 文件下载接口
     *
     * @param id 文件ID
     * @param response 响应对象
     */
    @GetMapping("{id}/download")
    public void downloadFile(@PathVariable Long id, HttpServletResponse response) {
        try {
            // 获取文件信息
            SysFile sysFile = this.sysFileService.getById(id);
            if (sysFile == null) {
                response.setStatus(HttpServletResponse.SC_NOT_FOUND);
                return;
            }
            
            // 设置响应头
            response.setContentType(sysFile.getType() != null ? sysFile.getType() : "application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(sysFile.getName(), "UTF-8"));
            response.setHeader("Content-Length", String.valueOf(sysFile.getSize()));
            
            // 这里是简化实现，实际项目中应该根据sysFile.getUrl()从文件系统或存储服务中读取文件
            // 这里返回一个简单的文本文件作为示例
            String content = "This is a sample file content for " + sysFile.getName();
            try (OutputStream out = response.getOutputStream()) {
                out.write(content.getBytes(StandardCharsets.UTF_8));
                out.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
            try {
                response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                response.getWriter().write("文件下载失败");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

